#region References
using Server.Commands;
using Server.Network;
using System;
using System.Collections;
using System.Reflection;
#endregion

namespace Server.Gumps
{
    public class SetCustomEnumGump : SetListOptionGump
    {
        private static readonly Type typeofIDynamicEnum = typeof(IDynamicEnum);

        private readonly string[] _Names;

        public SetCustomEnumGump(
            PropertyInfo prop,
            Mobile mobile,
            object o,
            Stack stack,
            int propspage,
            ArrayList list,
            string[] names)
            : base(prop, mobile, o, stack, propspage, list, names, null)
        {
            _Names = names;
        }

        public override void OnResponse(NetState sender, RelayInfo relayInfo)
        {
            int index = relayInfo.ButtonID - 1;

            if (index >= 0 && index < _Names.Length)
            {
                try
                {
                    MethodInfo info = m_Property.PropertyType.GetMethod("Parse", new[] { typeof(string) });

                    string result = "";

                    if (info != null)
                    {
                        result = Properties.SetDirect(
                            m_Mobile,
                            m_Object,
                            m_Object,
                            m_Property,
                            m_Property.Name,
                            info.Invoke(null, new object[] { _Names[index] }),
                            true);
                    }
                    else if (m_Property.PropertyType == typeof(Enum) || m_Property.PropertyType.IsSubclassOf(typeof(Enum)))
                    {
                        result = Properties.SetDirect(
                            m_Mobile,
                            m_Object,
                            m_Object,
                            m_Property,
                            m_Property.Name,
                            Enum.Parse(m_Property.PropertyType, _Names[index], false),
                            true);
                    }
                    else if (typeofIDynamicEnum.IsAssignableFrom(m_Property.PropertyType))
                    {
                        IDynamicEnum ienum = (IDynamicEnum)m_Property.GetValue(m_Object, null);

                        if (ienum != null)
                        {
                            ienum.Value = _Names[index];
                        }

                        result = Properties.SetDirect(m_Mobile, m_Object, m_Object, m_Property, m_Property.Name, ienum, true);
                    }

                    m_Mobile.SendMessage(result);

                    if (result == "Property has been set.")
                    {
                        PropertiesGump.OnValueChanged(m_Object, m_Property, m_Stack);
                    }
                }
                catch
                {
                    m_Mobile.SendMessage("An exception was caught. The property may not have changed.");
                }
            }

            m_Mobile.SendGump(new PropertiesGump(m_Mobile, m_Object, m_Stack, m_List, m_Page));
        }
    }
}